package com.holly.unit.deform.designer.util;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.holly.unit.deform.designer.model.FormElement;
import com.holly.unit.deform.designer.model.Options;
import com.holly.unit.deform.designer.model.Rule;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 类描述: 表单设计器工具类
 *
 * @author fxr
 * @version 1.0.0
 * @date 2022/8/4 14:00
 */
@Slf4j
public class DeFormUtil {

    private DeFormUtil() {
        throw new UnsupportedOperationException("DeFormUtil类无法实例化");
    }

    /***
     * FormElement 是否需要隐藏
     * @param option 元素配置信息
     * @param formValue 表单输入值
     * @return 是否可以显示
     */
    public static boolean recordVisible(Options option , JSONObject formValue){
        // 直接隐藏
        if (option.getHidden() != null && option.getHidden() == true) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * FormElement是否需要隐藏
     * @param element 表单元素
     * @param formValue 表单输入值
     * @return 是否可以显示
     */
    public static boolean recordVisible(FormElement element , JSONObject formValue) {

        if(element.getOptions() == null) return true ;

        Options option = element.getOptions();
        return recordVisible(option, formValue);

    }

    /**
     * FormElement是否需要隐藏
     * @param element 元素信息
     * @param value 表单输入值
     * @return 返回没有匹配通过的rule
     */
    public static Rule recordRuleValidator(FormElement element, JSONObject value) {

        if (element.getRules() == null || element.getRules().isEmpty()) return null;
        List<Rule> ruleList = element.getRules();
        Object recordValue = value.get(element.getModel());
        Options options = element.getOptions();
        // 有校验
        for (Rule r:ruleList) {
            // 必填
            if (options.getRequired() != null && options.getRequired() == true) {
                // 必填
                if (recordValue == null || "".equals(recordValue) || "[]".equals(recordValue)) {
                    return r;
                }
            }
            // 内置
            if (options.getDataTypeCheck() != null && options.getDataTypeCheck() == true) {
                if (StrUtil.isBlank(r.getMessage())) {
                    return r;
                }
            }

            //正则
            if (options.getPatternCheck() != null && options.getPatternCheck() == true) {

                if (recordValue == null) {
                    return r;
                }
                if (StrUtil.isBlank(r.getMessage())) {
                    continue;
                }
                Pattern p = Pattern.compile(r.getMessage().trim());
                if(!p.matcher(recordValue.toString().trim()).find()) return r ;
            }

            // 自定义
            if (options.getValidatorCheck() != null && options.getValidatorCheck() == true) {
                if (StrUtil.isBlank(r.getFunc())) {
                    continue;
                }
                boolean validator = check(r.getFunc(), value);
                if(!validator) return r;
            }
        }
        return null;
    }

    /**
     * 自定义脚本
     * @param script 脚本
     * @param formValue 表单输入值
     * @return
     */
    public static boolean check(String script , Map<String, Object> formValue) {
        Object ret = ScriptUtil.getScirptValue(script, formValue);
        if(ret instanceof Boolean) {
            return (Boolean)ret;
        } else {
            return ret != null && !ret.toString().trim().equals("0") && !ret.toString().trim().equals("false");
        }
    }
}
